CACHE' WWW
2. Первые шаги с CSP Web Gateway
2.1.Конфигурированиe CSP Web Gateway
2.2.1. Описание приложения в менеджере конфигураций Cache
2.2.3. Режимы работы приложения
2.2.4. Имена файлов и ссылки (URL)
2.3. Обзор CSP-программирования
2.3.1. Синтаксические элементы страниц
2.3.2.Создание Cache Server Pages
2.3.3. Пример динамической страницы
2.4. Работа с переменными в Cache Server Pages
2.4.1. Простая подстановка значения
2.4.2. Использование глобальных переменных
2.5. Дополнительные возможности CSP
2.5.1. Запросы к базе данных в CSP
2.5.3. Условная генерация HTML
3.1.2. Использование результатов запроса
3.1.3. Множественные значения поля ввода
3.1.4. Путешествие по полям формы
3.1.5. Операции с объектом %request
3.2.1. Обработка пользовательского сеанса
3.2.2. Свойства объекта %session
3.2.3. Методы объекта %session
4.2. Установление связи с базой данных
4.4. Завершение Web-приложения
Объектно-ориентированные базы данных (ООБД) по сравнению с традиционными (например, реляционными) БД обеспечивают следующие преимущества: во-первых, в таких БД хранятся не только данные, но и методы их обработки, инкапсулированные в одном объекте; во-вторых, ООБД позволяют обрабатывать мультимедийные данные; в-третьих, ООБД допускают работу на высоком уровне абстракции; в-четвертых, ООБД позволяют пользователям создавать структуры данных любой сложности.
Отличительной особенностью СУБД Cache' является независимость хранения данных от способа их представления, что реализуется с помощью, так называемой, единой архитектуры данных Cache'. В рамках данной архитектуры существует единое описание объектов и таблиц, отображаемых непосредственно в многомерные структуры ядра базы данных, ориентированных на обработку транзакций [1]. Как только определяется класс объектов, Cache' автоматически генерирует реляционное описание данных этого класса в формате SQL. Подобным же образом, как только в Словарь данных поступает DDL-описание в формате реляционной базы данных, Cache' автоматически генерирует реляционное и объектное описание данных, устанавливая тем самым доступ в формате объектов. При этом все описания ведутся согласованно, все операции по редактированию проводятся только с одним описанием данных. Это позволяет сократить время разработки, сэкономить вычислительные ресурсы и приложения будут работать значительно быстрее.
БД Cache' была первой базой данной, предназначенной для работы в сети Internet/Intranet. В версии Cache' 4.0. реализована технология создания динамических web-приложений Cache' Server Pages (CSP), которая пришла на смену технологии Weblink предыдущих версий Cache'. Кроме этого, системная библиотека %Net предоставляет классы, реализующие протоколы SMTP, POP3, HTTP, FTP и др.
1.1. Основные компоненты СУБД Cache'
На рис. 1. представлена архитектура Cache'.
Рис.1. Архитектура системы Cache'.
Cache' Server Pages -- это технология для разработки и функционирования высокопроизводительных динамических web-приложений. На первый взгляд эта технология похожа на Microsoft ASP, Sun JSP и подобные, но она коренным образом отличается от подобных систем:
В отличие от ASP, JSP, PHP и прочих, здесь нет нескольких уровней промежуточного ПО между Вашими приложениями и их данными. Тесная интеграция с объектами означает, что, например, мастер форм может генерировать базовые элементы форм, код для контроля данных, поиска и сохранения автоматически. CSP-приложения не нуждаются во внешних COM-объектах, подключениях JDBC/ODBC или других сложностях. Наконец, CSP наследует все лучшие характеристики Cache'. |
CSP - это следующее поколение ПО для доступа к Cache' из web. Эта технология была представлена чуть более года назад на конференции разработчиков InterSystems, как замена Cache' Weblink и Weblink Developer. Это уже был не просто доступ к базе данных из web-приложения, CSP вписывалась в объектную модель вашей задачи, связывая объекты-страницы с объектами-данными.
CSP включает технологию Hyper-Events, с помощью которой появилась возможность обрабатывать на стороне сервера любые события, порождаемые действиями пользователя. Web-приложения, благодаря Hyper-Events и Dynamic HTML становятся столь же интерактивнми, способными реагировать на действия пользователя, как программы для MS Windows.
Cache Server Pages позволяют серверу базы данных создавать высокоэффективные Web-страницы динамически. Для того чтобы сервер базы данных и Web-cepвер могли работать вместе, необходимо установить на Web-сервер средства доступа к Cache. В настоящее время Cache предоставляет интерфейсы к Web-серверам Microsoft, Netscape и Apache Group.
CSP-интерфейс на Web-сервере пересылает запросы, поступившие от Web-браузеров, в Cache. Программа использует расширение файлов .csp для определения, предназначен ли запрос для Web-сервера или для Cache.
Сервер базы данных разбирает данные, поступившие из браузера. Логика приложения использует эти данные для генерации HTML-кода, который Web-сервер передает в браузер для отображения.
Программа для обработки CSP-страниц находится в подкаталоге csp\bin каталога инсталляции Cache и называется CSPras.dll в Windows-системах (nphCSPcgi в UNIX). При вызове через URL эта программа использует переданные ей параметры для определения сервера Cache, который будет обрабатывать этот запрос. Код на языке Cache ObjectScript, необходимый для выполнения логики приложения, может быть размещен непосредственно внутри CSP-страниц. Как только Web-сервер распознает CSP-запрос, он немедленно направляет его, используя указанный интерфейс. Web-сервер предоставляет специальный серверный интерфейс прикладного программирования (API), характеризующийся высокой скоростью обработки. Через этот API осуществляется вызов требуемого приложения, которое, обработав полученный запрос, возвращает HTML-код в качестве результата. Web-сервер передает HTML-документ в браузер. CSP-технология управляет всем взаимодействием между Web-сервером и Cache, обеспечивая вызов необходимого прикладного кода из базы данных.
Web-сервер и сервер базы данных могут находиться как на одной машине, так и на различных машинах в сети. Сетевое соединение между ними образуется с использованием протокола TCP/IP. Минимальные требования к организации среды разработки и тестирования допускают размещение обоих серверов и браузера на одном PC. В примерах этой главы подразумевается именно эта кон ция.
Браузер запрашивает CSP-страиицу, используя URL следующего
вида: http://<hostname>/<path>/<filename>.csp[?...]
где <hostname> указывает на Web-сервер, <path>
задает виртуальный каталог на этом Web-сервере.
Однако файл <filename>.csp вовсе не обязан существовать в указанном каталоге на Web-сервере. По сути дела, каждая CSP-страница соответствует классу в базе данных Cache. Такие классы могут быть созданы любым известным способом создания классов, например, с использованием Cache Object Architect. Однако (и это является нормой) есть возможность создавать и изменять классы динамически. В этом случае код HTML просто сохраняется в файле в соответствующем каталоге. Когда Cache определяет (при первом вызове), что страница не представлена связанным с ней классом, Cache производит компиляцию и порождает класс. Компиляция и сохранение ее результата на сервере базы данных приводит к тому. что все последующие вызовы этой страницы (класса) выполняются значительно быстрее, чем первый. Изменение исходной страницы приводит к перекомпиляции.
2. Первые шаги с CSP Web Gateway
Разработка Web-приложения с помощью Cache Web Gateway-дополнительного CSP-модуля для Internet Information Server, Apache и Web-сервера Netscape - делится на две части:
- дизайн Web-страниц;
- интеграцию логики приложения в эти страницы для обеспечения изменения их содержания.
Первая задача обычно реализуется Web-дизайнерами, которые создают страницы в соответствии с требованиями приложения и представления данных в браузере; это проблема пользовательского интерфейса. Они также гарантируют, что информация будет представлена потенциальным клиентам изящно и с максимальным эффектом. Обычно эта группа разработчиков не концентрируется на технических деталях содержимого страниц. За это отвечают программисты, которые лучше разбираются в логике взаимодействия, но вовсе не обязаны быть хорошими Web-дизайнерами.
Основная концепция CSP состоит в обеспечении общей, дружественной среды для обеих групп разработчиков с целью обеспечить их совместную работу без необходимости разработчикам одной группы вникать в особенности работы другой.
Вы можете использовать любой редактор HTML для создания Web-страниц. Если необходимо, вы можете даже использовать обычный редактор ASCII-текстов.
И дизайнеры страниц, и программисты в равной степени отвечают за создание и обработку HTML-страниц. Программист добавляет в текст HTML код (скрипт) на Cache и другие специальные теги. После того как страница готова, она компилируется при первом к ней обращении и сохраняется в виде описания класса в базе данных Cache.
Однако CSP-класс можно сформировать и с использованием Cache Object Architect. В этом случае любой HTML-код, создаваемый дизайнером Web-страниц, помещается в метод OnPage этого класса.
Таким образом, разработка приложения, основанного на CSP, представляет собой создание набора статических HTML-страниц, оживляемых во время выполнения реальными данными, предоставляемыми базой данных Cache. А значит, исправление ошибок и дальнейшая разработка приложения производятся в связанных с ним HTML-страницах, а не в программах и глобалах, которые Cache создает в базе данных. Последние автоматически обновляются при запуске компилятора классов после внесения изменений в CSP-страницы.
2.1.Конфигурированиe CSP Web Gateway
CSP Web Gateway включает в себя средство администрирования CSP Web Gat Management, Web-ориентированнный интерфейс для конфигурирования и установки приложений. Для запуска этого административного средства исподьзуется URL следующего вида:
http://localhost/csp/bin/CSPmsSys.dll
если используется Microsoft Internet Information Server, или же:
http://localhost/cgi-bin/nph-CSPcgiSys
если используется Web-сервер Apache под UNIX в предположении, что Web-ceрвер находится на той же самой машине, что и вызывающий браузер.
Web Gateway Management может быть использован для конфигурирования раз личных аспектов функционирования CSP. Мы здесь остановимся только на процессе создания и обслуживания приложения на основе Cache Server Pages. Описание других возможностей можно найти в документации по CSP.
Приложение Cache создается в трех различных местах:
- создается каталог приложения на Web-сервере;
- создается приложение в менеджере конфигураций Cache (Cache Configuration Manager);
- конфигурируется CSP Web Gateway.
Рис.3. Создание виртуального каталога для Personal Web Server
На Web-cepвepe должен существовать виртуальный каталог для CSP-страниц. Если при установке Cache обнаруживает Web-сервер, каталог создается автоматически под именем /csp. Если Web-сервер устанавливается позднее, этот виртуальный каталог должен быть создан вручную. В случае Microsoft Personal Web Server это может быть сделано с помощью Personal Web Manager. В нем секция Advanced содержит кнопку Add, открывающую диалог Add directory (Добавить каталог). В первом поле должен быть задан физический каталог для размещения CSP-файлов. В дальнейшем все файлы CSP-приложений должны сохраняться в этом каталоге операционной системы. Имя виртуального каталога — это путь, по которому файлы CSP будут доступны на Web-сервере, — должно быть csp, oн вводится во втором поле. Кроме того, для этого пути должны быть установлены разрешение чтения и выполнения. (Это относится также ко всем подкаталогам, которые могут потребоваться)
Аналогичные настройки выполняются па других Web-серверах Microsoft. Директивы, необходимые для обработки CSP-файлов на Web-сервере Apache (вне зависимости от их местоположения) после установки Cache, уже созданы в специальном файле httpd.conf.
2.2.1. Описание приложения в менеджере конфигураций Cache
Редактор конфигурации Cache содержит закладку CSP, на которой перечислены все определенные СSP-приложения. Здесь может быть добавлено новое приложение путем задания виртуального каталога /csp. Основные свойства приложения:
Таблица 1.Определение свойств приложения
область | Область, в которой будет равотать приложение |
Cache Physical Path | Путь, по которому сервер Cache может получить физический доступ к файлам С5Р либо на том же сервере, либо сетевом диске |
Рекурсия | Признак того, что подкаталоги должны быть также включены |
Автокомпиляция | Признак того, что при изменении CSP-фалов связанный с ними класс в базе данных перекомпилируется автоматически |
Класс событий | Имя класса, чьи методы вызываются для обработки различных событий в приложении, например при тайм-ауте |
Тайм-аут по умолчанию | Время наступления таймаута в секундах (значение 900 подразумевает, что сессия завершится, если пользователь не ответит в течение 15 минут) |
Суперкласс по умолчанию | Суперкласс, чьи методы и свойства наследуют все CSP-классы. Если ничего не введено, то подразумевается суперкласс %CSP.Page |
Файлы обслуживания | Признак то го, что сервер Cache должен также передавать статические страницы, содержащиеся в каталоге приложения (желательно для стартовой и завершающей страницы приложения) |
Страница по умолчанию | Стартовая страница приложения, которая вызывается, если не задано никакое имя файла (соответствует Default. htm или index, htm на «нормальных» Web-серверах) |
Custom Error Page Package Name | Определенная пользователем страница сообщения об ошибке Имя пакета, в котором хранятся описания CSP классов. По умолчанию CSP |
Обязательно должны быть заданы два первых параметра, для всех остальных обычно используется значение по умолчанию.
Далее для описания приложения на Web-сервере используется CSP Web Gateway Management. Этой цели служит кнопка Add application (Добавить приложение) в разделе Configuration | Application Access. Выбор Edit Application и нажатие Submit может быть использовано для редактирования существующего приложения.
Каждое приложение состоит из набора файлов HTML, содержащих встроенные скрипты Cache кода и другие специальные теги. Файлы HTML хранятся в общем каталоге приложения. Такой каталог должен быть создан как подкаталог каталога приложений, заданного для всей системы (так называемый глобальный каталог приложений).
Например, глобальный каталог приложений может быть задан как C:\Cachesys \CSP с тремя приложениями в нем: Aircraft, Crew Management и Reservations. Страницы, относящиеся к конкретным приложениям, расположены в соответствующих подкаталогах:
С:\Cachesys\CSP\Aircraft
С:\Cachesys\CSP\Crewmanagement
C:\Cachesys\CSP\Reservations
Если Web-сервер запущен не на той же самой машине, что и Cache, глобальный каталог приложений должен находится на сервере базы данных либо должен быть доступен с него по сети.
2.2.3. Режимы работы приложения
Cache Web Gateway позволяет приложению работать в режиме state aware. В этом режиме для каждого пользователя между Web-сервером и сервером базы данных устанавливается постоянное соединение. Такой режим имеет то преимущество, что запросы каждого пользователя обрабатываются выделенным серверным процессом, которому не приходится отдавать часть своих ресурсов другим пользователям. Такой подход приводит к росту производительности и повышению безопасности.
Надо заметить, что по умолчанию установлен режим stateless. В этом режиме Web-интерфейс Cache обслуживает многих пользователей с помощью одного соединения. С точки зрения пользователя между этими двумя режимами нет различий. В предыдущих версиях Cache режим соединения необходимо было указывать при настройке приложения в Cache WebLink Developer Maintenance Suite. Начиная с версии 4, этот режим может изменяться динамически во время работы приложения с помощью параметров состояния. В разделе 11.3.2 это рассматривается подробнее.
2.2.4. Имена файлов и ссылки (URL)
Файлы HTML-страниц CSP-приложений обычно имеют расширение . csp. Однако сервер Cache также поддерживает и корректно передает HTML, SHTML,XML и различные графические файлы. Имена файлов чувствительны к регистру. Файлы, содержащие языковые элементы CSP, должны иметь расширение .csp. В остальном, к именам файлов применяются соглашения, принятые в используемой операционной системе. Поскольку каждая CSP-страница компилируется в класс Cache, ее имя должно быть также корректным именем класса. Для задания гиперссылки с одной страницы CSP-приложения на другую используется полное имя страницы, включая расширение . csp.
Для обслуживания внутренней логики приложения и работы Web gateway используется более сложный синтаксис. Однако Web gateway создает такие ссылки автоматически, поэтому разработчик не обязан разбираться в этих подробностях. Cache Gateway автоматически преобразует простые URL, заданные программистом, в корректное внутреннее представление.
2.3. Обзор CSP-программирования
CSP является полностью объектно-ориентированной технологией. Она поддерживает все фазы создания и сопровождения приложений, ориентированных на базы данных.
Технология Cache Server Pages работает как с полной сессией браузера, так и с ее частями, например, запросами и страницами. Запрос - это вызов HTTP-метода, включая CGI-переменные, элементы формы и строки запроса. Страница включает в себя всю страницу, посылаемую в браузер, включая заголовки и содержание. CSP-страницы (файлы с расширением .csp) могут быть созданы как вручную, с использованием текстового редактора, так и с помощью специальных инструментов разработки Web-страниц, таких как Macromedia Dreamweaver или Microsoft FrontPage. Cache даже обеспечивает наличие специальных пунктов меню в Dreamweaver, которые упрощают поддержку Cache Server Pages. Это возможно, поскольку Cache соответствует стандарту HTML, расширяя его специальными CSP-тегами (аналогично тому, как это делает XML).
Каждая страница CSP представлена в базе данных, как класс, создаваемый при ее компиляции. Программист может также породить такой класс непосредственно на Web-сервере, минуя этап создания HTML-страницы.
Незаметно для пользователя мощная база данных Cache обеспечивает доступ к хранимым данным как с использованием классов, так и с помощью SQL-запросов. Таким образом, CSP совмещает в себе преимущества объектно-ориентированной, дружественной среды разработки с функциональностью SQL-запросов, и все это поддерживается высокопроизводительным хорошо масштабируемым хранилищем данных.
2.3.1. Синтаксические элементы страниц
В дополнение к обычному HTML-коду CSP-страницы характеризуются элементами, способными динамически генерировать содержание. Такие динамические данные представлены объектами Cache, наборами данных (result sets), перемеными и другими элементами. Помимо классических тегов HTML CSP-страница Может содержать следующие элементы:
- Выражения в форме #(... )#, заменяемые во время выполнения (при генерации страницы) вычисленными значениями.
- Теги CSP В форме <CSP: ххх ... > , предоставляющие встроенную и определенную программистом функциональность.
- Выполняемый код на языке Cache Object Script для генерации страницы в момент выполнения приложения. Он заключен в скобки тега script следующей формы:
<script language= Cache runat=server> … </script>
- Следующий тип Cache-скрипта выполняется только в процессе компиляции страницы для сохранения результата в базе данных. Код его похож на предыдущий, однако открывающий тег выглядит по-другому: <script language=Cache runat=compile>
- Ссылки на другие CSP-страницы в форме #url(...)# или просто ссылки URL
- Обращение к подпрограммам, хранимым на сервере, в форме #server( )#.
2.3.2.Создание Cache Server Pages
Процесс разработки CSP-страниц похож на процесс разработки классических страниц HTML:
- Для создания и сохранения начальной версии страницы используется специальный инструментарий или обычный текстовый редактор.
- Содержимое и вид таких страниц тестируется на различных семействах Web-браузеров.
- Если необходимо, страница дорабатывается с помощью редактора, сохраняется и просматривается в браузере заново.
Рис. 4 Добавление тега CSP:WHILE в Macromedia Dreamweaver
CSP-приложение первоначально создается в виде набора статических элементов HTML-страницах, которые затем получают расширение .csp. После этого в необходимые места добавляются CSP-теги, требуемые для получения динамического содержания. Для добавления CSP-тегов необходимо использовать возможности редактирования текстов редактора HTML.
Исключением является Macromedia Dreamweaver (начиная с 3-й версии), который позволяет, используя специальный пункт меню Insert > Cache CSP (см. рисунок), добавлять на страницу большинство элементов CSP,
2.3.3. Пример динамической страницы
Технология CSP предоставляет возможность определения пользовательских тегов, основанную на XML, для представления динамического содержания; она относительно проста для изучения и использования. Эти теги имеют, однако, то преимущество, что позволяют использовать объекты Cache непосредственно на HTML-странице, В комбинации интуитивно понятного синтаксиса и прямого доступа к базе данных и проявляется подлинная мощь CSP.
Следующий пример показывает, как можно включить текущую дату в стартовую станицу приложения. Фрагмент кода:
<h2 align=center>Hello and welcome to our eshop </h2>
<h2 align=center> on #($Zdate($Horolog.9))# </h2>
содержит в качестве подставляемого значения вычисляемое выражение, использующее $Horolog и $Zdate для получения и форматирования текущей даты.
Рис.5. HTML-страница с динамически созданным содержимым
Синтаксическая конструкция #(...)# является одним из фундаментальных элементов технологии CSP, Эта последовательность символов в HTML-странице информирует Web-сервер, что сервер Cache должен вычислить выражение, содержащееся в таких скобках, и вернуть его значение. Фрагмент кода:
$Zdate($Horolog,9)
использует функцию $Zdate языка Cache Object Script для получения форматированной даты. В нашем примере используются два аргумента этой функции: системная переменная $Horolog, содержащая текущую дату и время в виде двух и чисел, и параметр форматирования 9, заставляющий функцию $Zdate вернуть дату в формате месяц, день и год, как показано на рис. 5.
Когда страница, содержащая две приведенные выше строки кода, сохраняется в месте, доступном серверу Cache, она может быть получена и отображена любым браузером.
Эта ссылка может быть использована в качестве URL, если и браузер, и Web сервер, и сервер базы данных запущены на одной и той же машине. В противном случае вместо local host необходимо ввести сетевое имя или IP-адрес Web-ceрвера.
Функция браузера “display source text” (показать исходный текст) позволяет увидеть текст, который Web-сервер вернул в качестве результата запроса в браузер, то есть чистый HTML-текст. Что-то типа:
<h2 align=center>on January 1. 2001 .</h2>
вместо второй строки исходного кода. Это ответ, который сервер Cache сгенерировал и вернул в ответ на запрос Web-сервера. Таким образом, при просмотре в браузере мы никогда не увидим исходный текст страницы, только динамически сгенерированное содержание.
2.4. Работа с переменными в Cache Server Pages
Технология CSP позволяет использовать имена переменных, которые автоматически заменяются их значениями во время выполнения. Web-дизайнер может свободно задавать основные свойства каждой переменной, например местоположение на экране, формат и представление, не задумываясь об источнике ее значения во время выполнения. Эту задачу решает программист, который снабжает макет страницы элементами логики приложения и таким образом обеспечивает ее функциональность.
Очевидно, обе эти задачи может решать и один человек. Однако практика показывает, что вышеупомянутое разделение труда является предпочтительным, поскольку дает лучшие результаты, как с точки зрения функциональности, так и с точки зрения внешнего вида приложения.
2.4.1. Простая подстановка значения
Подстановка значения путем задания функции или системной переменной уже был продемонстрирован на примере текущей даты в предыдущем разделе. Продемонстрированный метод может быть применен для вставки значения переменной в любое место CSP-страницы.
Предположим, в переменной DOB хранится чья-то дата рождения. Тогда #(DOB)#
в любом месте страницы задаст ссылку на эту переменную. Вместо этой ссылки во время выполнения Cache подставляет текущее значение этой переменной и возвращает его (вместе с остальным содержимым страницы) через Web-сервер в браузер.
Для придания отображаемому значению необходимого внешнего вида эта ссылка может быть обрамлена любыми форматирующими тегами HTML. Например, дата может быть показана курсивом и отформатирована как заголовок. Необходимо заметить, что форматирование должно быть применено ко всему выражению (включая закрывающую скобку и символ «#»).
На использование переменных не накладывается никаких ограничений, поэтому они могут быть использованы как часть ссылки (URL), или в качестве параметра в HTML-теге.
Если указанная переменная в момент выполнения не существует, никакой замены не производится и в браузере появляется сообщение об ошибке. Однако если переменная существует, но не имеет значения, не отображается ничего. Если содержимое строки составляет только эта переменная, не выводится вся строка.
2.4.2. Использование глобальных переменных
Наряду с локальными переменными, которые существуют только в рамках сеанса, подобным же образом в CSP могут быть включены и глобальные переменные из базы данных. Простым примером является счетчик обращений к странице (hit counter). Код скрипта для подсчета числа обращений и подстановки значений переменных может выглядеть следующим образом:
<script language="Cache" runat="server"> Set ^VisitNumber=$Get(^VisitNumber)+1
</script>>
Вы #(^VisitNumber)#-й посетитель этой страницы. <br>
Первая строка открывает блок скрипта. Параметр language указывает в качестве языка Cache ObjectScript. Здесь также возможны JavaScript для Java Server Pages и VBScript для Microsoft's Active Server Pages. Оба эти языка скриптов также правильно обрабатываются на страницах CSP. Параметр runat="server" информирует Web-сервер о том, что данный скрипт во время выполнения будет обрабатывать сервер Cache. Другое возможное значение этого параметра runat="compile"; указывает Cache на необходимость обработки скрипта только во время компиляции класса. Если параметр runat опущен, то предполагается обработка скрипта на клиентском компьютере (при загрузке страницы в браузер). Тег </stript> является закрывающей скобкой для блока кода скрипта. В приведенном примере код скрипта состоит из одной строки. Значение глобальной переменной ^VisitNumber, хранимой в базе данных, увеличивается на единицу. Функция $Get получает значение этой пользовательской переменной из базы данных. Эта переменная может и не существовать, она будет создана и проинициализирована при первом обращении. Команда Set присваивает переменной новое значение.
Аналогичным образом с помощью конструкции #(...)# может быть отображено вычисляемое значение.
2.5. Дополнительные возможности CSP
Cache Server Pages предоставляют несколько дополнительных языковых элементов, которые позволяют создавать простые и в то же время изощренные процедуры выборки и отображения данных. Они включают:
- заранее определенные запросы к базе данных;
- циклы;
- условные конструкции.
2.5.1. Запросы к базе данных в CSP
Типичным применением запроса к базе данных является получение списка бестселлеров в электронном книжном магазине. Обычно это список названий доступных сейчас произведений, по каждому из которых пользователь может щелкнуть и получить более подробную информацию о книге. Поскольку список бестселлеров может непрерывно изменяться, это хороший пример динамического содержания Web-страниц.
Технология CSP предоставляет простые средства для использования ранее упомянутого класса Book. Для генерации списка бестселлеров каждый объект Book имеет свойство SalesSuccess, которое представляет собой средневзвешенное значение объема продаж данной книги за определенный период времени. Это значение облегчает определение степени популярности той или иной книги. Гиперссылки на информационные страницы, посвященные отдельным бестселлерам, генерируются на основе списка названий, получаемого из базы данных с помощью заранее определенного SQL-запроса. Для этого и служит тег CSP:QUERV, позволяющий задать на CSP-странице класс (из которого должны быть получены данные) и имя ассоциированного с ним специального запроса. Это запрос является частью определения класса в базе данных (см. главы 1 и 4). В нашем случае в описании класса Book должен быть определен запрос ShowBestseller. Тег CSP:QUERY является одним из наиболее важных элементов языка CSP. Он обеспечивает динамическое представление данных на основе изменяющихся и сложных критериев, выступая в роли оболочки, позволяющей встраивать SQL-запросы непосредственно в HTML-страницы. Сервер Cache поддерживает подготовку и выполнение запроса к базе данных при старте приложения и автоматическое закрытие запроса при завершении. Если коснуться подробностей, тег CSP:QUERY выполняет следующую работу:
- подключение к выбранному классу Cache;
- выполнение заданного запроса;
- взаимодействие CSP-страницы с результатами запроса (Result-felt).
Тег CSP:QUERY выполняет запрос к базе данных и присваивает имя результату выборки (объекту ResultSet). Это позволяет использовать результаты запроса внутри страницы. Тег CSP:QUERY имеет три атрибута (параметра):
- Name — имя объекта ResultSet;
- CLASSNAME — определяет класс Cache, содержащий определение запроса;
- QUERYNAME — задает имя запроса, который необходимо выполнить.
В примере имя ResultSet — Bestseller. Запрос ShowBestseler должен быть определен, как показано ниже:
SELECT TOP 10 BookTitle FROM Book
ORDER BY SalesSuccess DESC
Вызов CSP:QUERY оформляется следующим образом:
<СSP:QUERY NAME=Bestsellеr CLASSNAME=Book QUERYNAME=ShowBestseller>
Приведенный выше запрос не имеет параметров, он всегда возвращает 10 наиболее продаваемых книг, В документации по Cache описано, как можно расширить этот запрос с помощью параметров, чтобы придать ему большую гибкость.
После обработки запроса отфильтрованный результат становится доступен через объект ResultSet с именем Bestseller, ассоциированный с вызывающей страницей. Результат выборки может быть свободно использован и представлен на этой странице. Например, мы.можем использовать метод Get объекта Resultset для извлечения колонки BookTitle, которую мы далее просто выведем на экран-
#(Bestseller. Get("BookTitle"))#
Ссылка на информационную страницу может быть сформирована с использованием ID этой книги следующим образом:
<а href=BookInfo.csp?ID=#(Bestseller.Get("ID"))#>
В следующем разделе будет показано, как этот результат может быть представлен в виде таблицы.
Обычно результат выборки состоит из нескольких записей. Нам необходим метод для доступа к этим записям как индивидуально, так и в цикле с последующим выводом в виде HTML-кода Web-страницы.
Аналогично языку программирования CSP предоставляет теги для управления ходом выполнения программы, Один из них — тег CSP:WHILE. Он обеспечивает циклическую генерацию фрагмента страницы в зависимости от того, выполнено условие или нет. Примером такого условия является достижение конца реультата выборки.
Тег CSP:WHILE включает параметр CONDITION, который задает условие окончания» цикла While . Все элементы, используемые для генерации результирующей страницы и расположенные после этого тега, будут повторены столько раз сколько выполнится цикл. Тег </CSP:WHILE> заканчивает этот блок. Таким образом, фрагмент для построчного вывода списка бестселлеров из предущего раздела будет иметь вот такой вид:
< С SP:WHILE CONDITI0N=Bestseller.Next()>
< а href=Bookinfo.csp?ID-#(Bestseller.Get("ID"))#>
#(Bestseller.Get("BookTitle"))# </a> <br>
</CSP:WHILE>
2.5.3. Условная генерация HTML
Наряду с циклической генерацией фрагментов Web-страницы CSP может управлять ветвлением процесса создания страницы в зависимости от некоторых условий.
Аналогично популярным языкам программирования, CSP предоставляет теги IF и E LSE с соответствующими им “ закрывающими скобками”.
Атрибут CSP: BIND предоставляет элегантное средство получения данных из Cache' и записи модифицированных данных обратно в базу. Этот атрибут служит дополнением к обычным тегам HTML.
CSP: BIND позволяет связывать HTML-формы непосредственно с объектами Cache. Поскольку при этом не требуется описывать никаких действий или программировать дополнительные методы, это простейший путь связать данные, хранящиеся в виде объектов в базе данных, с Web-приложением. Рассмотрим следующий фрагмент:
<CSP:QBJECT NAME=CurrentCust CLASSNAME=Customer
OBJECTID=#( %request.Get(“CustId”))#>
<FORM NAME=CurrentCustForm CSP:BIND+CurrentCust>
Фамилия : <INPUT TYPE=TEXT NAME=Name CSP:BlND=Name>
Имя : <INPUT TYPE=TEXT NAME=Surname CSP:BIND=Surname>
Адрес : <INPUT TYPE=TEXT NAME=Address CSP:BIND=Address>
…
Кредитная карта : <INPUT TYPE=TEXT NAME=Ccard CSP:BIND=Ccard>
…
</ Form >
Атрибут CSP: BIND используется и в заголовке формы, и в конкретных полях ввода, в заголовке он служит для привязки формы к конкретному объекту данных. С помощью тега CSP: OBJECT порождается объект Customer по его ID, присвоенному полю Custld (где-то вне этого фрагмента) и переданному в запросе. Теги С SP :В IND в отдельных полях служат для визуализации и, возможно, изменения свойств объектов. При этом программисту нет необходимости делать что-нибудь еще для этой цели. Содержимое базы данных автоматически обновляется, когда пользователь нажимает кнопку Submit (здесь не показана).
Однако этот метод работает только в том случае, когда свойства объекта могут быть непосредственно отображены в полях ввода. Если же требуются дополнительные преобразования, как, например, в случае даты или времени, необходимо использовать стандартные методы обработки форм.
Представление изменяющихся данных — это только один из аспектов динамических Web-страниц. Другой аспект — это вз а им о действие между пользователем и сервером. Например, пользовательский ввод может сильно влиять на данные, отображаемые в браузере. Иногда пользователь может даже изменять содержимое базы данных.
В этом отношении представляет интерес совместное использование CSP и форм, обслуживание запросов и сеансов, авторизация пользователей для определения их уровня взаимодействия с базой данных. Здесь описаны основные шаги, с помощью которых Cache обрабатывает любой запрос, поступающий с Web-сервера:
- Создается новый объект % CSP .Request и ссылка на него помещается в переменную %request.
- Если это первый запрос в сеансе (последовательности запросов от одного браузера), создается новый объект % CSP .Session и ссылка на него присваивается переменной %session. В противном случае в нее записывается ссылка на уже существующий объект % CSP.Session.
- Cache вызывает метод Page класса %CSP.Page, соответствующий используемой гиперссылке (URL).
- При выполнении метода Page вызываются другие методы:
• Метод ОnРrеНТТР инициализирует страницу и порождает HTTP-заголовки, которые впоследствии пересылаются Web-сервером в браузер.
• Метод OnHeaders пересылает эти заголовки.
• Метод QnPage генерирует текущее содержимое страницы (HTML, XML, двоичный файл).
• Метод OnPostHTTP выполняет очистку.
- Объект %session существует до тех пор, пока сеанс не будет закрыт приложением или пока не истечет тайм-аут. В обоих случаях вызывается метод end, служащий для корректного закрытия объекта %session.
Текст, введенный пользователем в форме, может быть передан Web-серверу с использованием HTTP-протокола двумя способами:
Методом GET в виде части URL.
Методом POST в теле запроса HTTP.
Например, следующая гиперссылка:
http:// myfirm.com/customer/info/LoginStatus.csp?CustoriterID=47110815
передает идентификатор ( ID ) клиента методом GET.
В соответствии со стандартом HTML каждая форма ввода состоит из пар “имя/ значение”. Это не обязательно является результатом пользовательского клавиатурного ввода (например, скрытые поля па форме). Однако термин “поля ввода” исторически закрепился для обозначения подобных потоков данных, поэтому мы его здесь и используем.
Бывает, что с определенным именем поля связано несколько значений, например в случае текстового поля с возможностью множественного выбора. Вместе с некоторой общей информацией, относящейся к запросу, входные данные формы передаются в базу данных классу %CSP. Page, соответствующему вызываемой CSP-странице. Это выполняется с помощью объекта %CSP. Request. При каждом вызове метода Page системная переменная %request содержит ссылку на текущий объект %CSP.Request.
Таким образом, в случае гиперссылки, приведенной выше, объект %С S Р.Request получит свойство URL со значением: "http://rnyf irm .com/custo mer /info/LoginStatus.csp"
плюс свойство PageName со значением LoginStatus. csp, а также поле с именем Custom e rlD и значением 47110815.
Как правило, ввод осуществляется с помощью форм HTML. В случае метода POST это означает, что когда содержимое формы передается, объект %request принимает четыре поля ввода формы: CustomerlD, Name, Address и City, как показало в следующем примере:
<form method="post" name=”Customer"
action=”/customer/info/CustomerUlpdate.csp?
Customer ID=47110815">
Name: <input type="text" name="Name">
Street <input type="text" name="Address">
City: <input type="text" name="City">
</ form >
Важно следующее: имена специфичных для Cache элементов, например CSPT oken начинаются с символов «CSP». Чтобы избежать конфликта, вы не должны использовать эти символы в качестве начальных для имен своих элементов данных. Следующая таблица представляет полный перечень свойств объекта
Таблица 2. Свойства объекта %request
Имя |
Тип данных |
Описание |
Charset |
% Library .String |
Набор символов , в котором закодирован запрос ; если не указан в заголовке HTTP, используется набор символов текущей страницы |
ContentType |
% Library .String |
Тип содержимого (MIME), соответствующий заголовку HTTP |
Cookies |
Массив строковых значений |
Набор Cookies, установленных в браузере и присланных Web-cepeep |
CgiEnvs |
Массив строковых значений |
Полный набор переменных окружения CGI, включая их значения |
Gateway-Application |
% Library .String |
Имя , под которым приложение было создано в Web Gateway Manage' |
Gateway-Connection Name |
% Library .String запрос |
Имя соединения с сервером Cache в CSP Gateway, которому послан |
Method |
% Library .String |
Метод HTTP ( например , GET) |
New session |
% Library . Boolean |
ИСТИНА для первого соединения сеанса и ЛОЖЬ для всех остальных |
PageName |
% Library .String |
Имя страницы CSP, например Login. csp |
URL |
% Library .String |
Гиперссылка на заданную страницу , включая ее имя и расширение но без любых элементов запроса (CGI) |
userAgent |
% Library .String |
Тип браузера , из которого послан запрос ; соответствует заголовку http User Agent |
3.1.2. Использование результатов запроса
Встроенные методы объекта %request позволяют использовать полученные в запросе данные. Они описаны в следующей таблице.
Таблица 3. Методы объекта %request
Имя |
Возвращаемое значение |
Функция |
Аргумент ( ы ) |
Count |
%Library. Integer |
Возвращает число значений для заданного имени поля |
Имя поля ввода (%Library.string) |
Get |
Соответствует аргументу |
Извлекает данные , посланные в запросе |
Имя поля ввода (% Library . String ), значение по умолчанию ("/ « .Library. String, необязательный , default = » ), номер экземпляра (%LibraryJnteger. необязательный , по умолчанию !) |
Kill |
Нет |
Удаляет поле ввода из объекта %request |
Имя поля (%Li brary. String, необязательный , по умолчанию все ), номер экземпляра (% Library . Integer, необязательный , по умолчанию все ] |
Next |
%Library.String |
Позволяет перебрать все поля ввода формы ; возвращает имя следующего поля |
Имя предыдущего поля , или "" (%Library. String) |
Set |
Элемент данных |
Присваивает измененное значение элементу данных поля ввода или создает новый элемент |
Имя поля (% Library . String ), значение (% Lib гагу . String), номер экземпляра (^Library.Integer, необязательный , по умолчанию 1) |
Каждый объект %request содержит в CgiEnvs набор переменных окружения для текущего Web-запроса. Каждый элемент этого набора состоит из имени переменной окружения и ее текущего значения. Для получения доступа к требуемой переменной может быть использован метод GetCgiEnvO:
%request. GetCgi Env(name)
Таким образом
% request. GetCgiE nv( 'SERVER _NA ME")
Дает в качестве возвращаемого значения имя Web -сервера. Метод NextCgiEnv()
%request.NextCgiEnv(…)
позволяет получить все значения переменных окружения. Массив Cookies может быть обработан аналогично (методы GetCookieO, NextCoo k ie) и т. д. Метод Get ( ) объекта % request возвращает значение поля ввода, используя его имя Например, если страница CSP была вызвана при помощи следующей гиперссылки-http://W W W.myco m pany.com/csp/ i nfo/Log i nStatus.csp?CustomerID = 47110815 метод % request. Get ("Customer ID") вернет значение "47110815". Заметим: имена полей ввода чувствительны к регистру, то есть прописные и строчные буквы считаются различными. Следовательно, метод %request. Get ("customerid") должен в этом случае вернуть"".
Метод Get () может быть также вызван с необязательным вторым параметром, который задает значение по умолчанию вместо пустой строки: %request.Get ("Customer I D", "none") вернет или значение поля CustomerlD, или строку " none " в случае его отсутствия.
3.1.3. Множественные значения поля ввода
В некоторых случаях в объекте %request содержатся множественные поля ввода. Имеется в виду, что одному имени принадлежит несколько значений. Это бывает, например, когда:
- один элемент формы возвращает несколько значений, например в случае множественного выбора в теге SELECT;
- элемент формы (обычно это поле ввода текста) возвращает значение длиннее 32 кбайт; Cache автоматически разбивает его на несколько значений;
- форма содержит несколько полей ввода с одинаковыми именами;
- сгенерированная гиперссылка (URL) содержит одно и то же поле несколько раз. Хотя это обычно свидетельствует об ошибке в программе, иногда может быть и полезно.
Если объект %request получает поле данных с множественными значениями, в метод Get() может быть добавлен третий параметр; например, метод %request .Get ("CustomerlD", "none" ,4) позволит получить доступ к четвертому элементу поля CustomerlD. Если такой элемент не будет найден, функция вернет «пусто» в качестве результата. Если третий параметр опущен, подразумевается первый элемент.
Метод Count() возвращает для заданного имени число его значений, присутствующее в объекте %request. Это позволяет использовать следующий фрагмент кода для доступа ко всем значениям поля "Maxi".
For i=1:1:%request.Count(" Мaxi") {
Set x = %request.Get("Maxi",,i)
}
3.1.4. Путешествие по полям формы
Метод Next() является весьма мощным средством для обработки пользовательског ввода, позволяя чрезвычайно просто осуществить навигацию по всем полям данных, полученным Web-сервером от формы. Метод напоминает функцию $ Order в Cache ObjectScript, которая возвращает следующую локальную переменную.
Допустим, передан следующий URL:
http:// myfirm. com/ customer/ info/ LoginStatus. csp? Status= s& CustomerID=47110815
Тогда вызов
%request.Next(“”)
вернет имя первого поля, в данном случае CustomerlD.
Почему первым полем данных будет CustomerlD, а не Status? Последовательность хранения полей в объекте %request не всегда совпадает с порядком появления отдельных
полей в запросе. На самом деле поля сортируются в порядке следования их имен, а точнее, в последовательности сортировки, определенной администратором во время установки Cache. Как правило, она соответствует порядку латинского алфавита. Для проверки этой настройки несложно создать тестовую страницу.
Вызов:
% request. Next ("CustomerID")
вернет Status, имя следующего поля данных. Наконец,
% request. Next ("Status")
вернет «», так как поле Status является последним.
3.1.5. Операции с объектом %request
Помимо чтения имен и значений полей имеется возможность изменения отдельных полей данных, хранящихся в объекте %request. Допустима не только корректировка существующих значений, но и создание новых полей данных. Например, вызов:
%request.Set("Length" , 12)
изменит значение поля Length на 12, если оно существует. В противном случае будет создано новое поле с именем Length и ему будет присвоено значение 12.
Вызов:
%request. Kill(“Length")
удалит из объекта %request поле Length со всеми его значениями. Если же задан второй параметр, метод Kill () удаляет только отдельные экземпляры значений множественного поля. Все уцелевшие значения перенумеровываются, поэтому
выборочное удаление не приводит к появлению «брешей» в нумерации значений.
Вызов:
% request . Kill ()
удаляет все поля данных объекта %request.
CSP позволяет отслеживать параметры состояния сеанса, такие как данные о пользователе, браузере, Web-сервере и базе данных. Именно это и превращает CSP в поистине эффективный инструмент. Понятие сеанса (session) позволяет использовать единый набор данных на протяжении всего сеанса. Например, когда посетитель сайта делает on-line- покупку, можно обрабатывать и ввод, и информацию о транзакции как единый набор данных, несмотря на то, что эти данные могли быть получены с различных Web-страниц. Сеанс обеспечивает программиста средой, необходимой для реализации подобных Web- приложений.
Центральным звеном в управлении сеансом является объект %session. Подобно объекту %request (описанному ранее), объект %session автоматически создается Ca che и содержит информацию о пользовательском сеансе в виде пар «имя/значение”. Однако в отличие от объекта %request он не пересоздается при каждом запросе, а поддерживается на протяжении всего сеанса. При этом отдельные элементы данных, связанные с сеансом, конечно же, могут претерпевать изменения. Объект %session создается, как только пользователь первый раз открывает CSP-страницу в браузере? и хранится до тех пор, пока сеанс не завершится (по инициативе приложения либо по тайм-ауту). По истечении сеанса объект уничтожается и занимаемая память освобождается. Если тот же самый пользователь обращается к другой странице приложения (а объект %session все еще существует), его запрос будет отнесен к текущему сеансу; данные объекта %session будут доступны при обработке этого запроса.
3.2.1. Обработка пользовательского сеанса
При обработке пользовательского сеанса выполняются следующие внутрисистемные действия:
Если приложение закрывает пользовательский сеанс во время обработки страницы, удаляется и объект %session. Во всех прочих случаях объект просто деактивируется вплоть до поступления нового запроса от того же пользовать либо до закрытия сеанса по тайм-ауту.
3.2.2. Свойства объекта %session
Объект %session содержит ряд предопределенных полей, которые могут быть использованы при программировании CSP. При каждом вызове метода Page() происходит актуализация объекта %session параметрами текущего сеанса. Ниже вы найдете краткое описание предопределенных свойств класса % session.
Таблица 4. Свойства объекта %session
Имя |
Тип данных |
Описание |
По умолчанию |
AppTimeOut
|
%Library. Integer
|
Время ожидания следующего пользовательского ввода (с) |
1200
|
EndSession
|
%Library. Boolean
|
Признак , указывающий , следует ли закрывать |
Ложь
|
OnAppTime-OutMethod |
%Library. String |
Имя метода , который должен быть выполнен в случае тайм - аута |
— |
onEndMethod
|
%Library. String
|
Имя метода , который должен быть выполнен |
—
|
Preserve
|
%Library. String
|
Уровень контекста , который должен сохраняться |
0
|
SessionId |
%Library. Integer
|
Уникальный идентификатор сеанса ( только для чтения ) |
_
|
3.2.3. Методы объекта %session
Некоторые методы объекта %session уже были задействованы в примере.
Методы объекта %session имеют двойное назначение. Во-первых, они отслеживают системные настройки, действующие для сеанса, с целью оказания влияния на выполнение прикладной программы.
Во-вторых, что значительно более важно и используется гораздо чаще, эти методы позволяют обрабатывать пользовательские данные на протяжении всего сеанса передавать их от страницы к странице. Прикладная программа может просто с хранить необходимую информацию в объекте %session в виде пар «имя/значение” и использовать ее на любой другой странице.
Попутно заметим, что при сохранении в объекте %session наряду со встроенными типами данных Cache допустимы и пользовательские типы данных.
Наше меленькое приложение состоит из трех CSP-страниц с HTML-кодом, тегами CSP и встроенным кодом на Cache ObjectScript:
Для начала рассмотрим, как функционирует этого приложение. Вызовем его, используя ссылку: http:// L oca l host/csp/user/First.csp
Сначала появляется стартовая страница First.csp, содержащая лишь несложное главное меню нашего приложения:
В результате щелчка по пункту меню Выбор физического лица откроется страница Second.csp, как раз для этого и предназначенная.
Рис. 6. Главное меню нашего приложения
Рис. 7. Страница Second.csp — выбор физического лица
Рис. 8. Страница Third.csp — персональные данные
Наше приложение работает в области USER, поэтому все три страницы хранятся в каталоге C:\Cachesys\csp\user. Наметить их структуру можно с помощью любого редактора HTML (или даже с помощью текстового редактора).
Такой подход имеет свои преимущества: за исключением компиляции, процесс разработки CSP-страниц сводится к «традиционному» Web-проектированию. Это делает возможным разделение труда: доверив Web-дизайнеру оформление страницы, программист может сосредоточиться на ее функциональном наполнении, таком как связь с базой данных, или, обобщая, на всем, что «у лошадки внутри». Чтобы отразить изменения в HTML-странице в базе данных, страница должна быть откомпилирована. Разумеется, это касается и новых страниц. Однако Cache сама проверяет актуальность хранимых классов, снимая эту заботу с программиста. Лишь небольшая задержка с ответом на запрос, полученный от браузера, свидетельствует о том, что произошла автоматическая компиляция. За исключением расширения, страница First. csp ничем не отличается от обычных статических HTML-страниц. С точностью до заголовков, которые могут автоматически добавляться редактором HTML, ее код имеет вид:
< body >
< h1>Главное меню</ h1>
< a href =” Second . csp ”>Выбор физического лица</ a >< br >
<a href=”/default.htm”> Завершение раболты </a><br>
</body>
Страница Second.csp, озаглавленная «Выбор физического лица», создает таблицу из двух строк и четырех столбцов. В полях первой строки содержится текст: ID, Имя , Фамилия и Дата рождения. В конце страницы находится ссылка «Назад в основное меню».
Исходный текст статической части страницы показан ниже (снова без заголовков):
< body bgcolor =”# FFFFFF ”>
< h1>Выбор физического лица</ h1>
<table border=”1” width=”81%”>
<tr>
<td width=”6%”><b>ID</b></td>
<td width=”31%”> <b> Имя </b></td>
<td width=”36%”><b> Фамилия </b></td>
< td width =”27%”>< b >Дата рождения</ b ></ td >
<tr>
<td width=”6%”></td>
<td width=”31%”></td>
<td width=”36%”></td>
<td width=”27%”></td>
</tr>
</table>
< p >< a href =” First . csp ”>Назад в основное меню</ a >
</body>
Следующий этап разработки страницы Second. csp — добавление тегов для организации доступа к базе данных — должен быть выполнен в режиме редактирования исходного текста HTML вашего Web-редактора. Но сначала создадим страницу Third.csp. Ее заголовок выглядит так: Персональные данные (# (%r equest. Get ("Id "))#), поэтому ID физического лица, использованный как ссылка со страницы Second, csp, будет вставляться в заголовок при каждом вызове этой страницы. Эта передача значения происходит через объект % request. Для отображения данных создается таблица, содержащая текстовые поля ввода с метками и кнопку Send (рис. 11.9). Метки и назначение полей соответствует именам переменных в Second.csp, которые, в свою очередь, позаимствованы у свойств класса Person.
Рис. 9. Форма для ввода персональных данных в редакторе Dreamweaver
4.2. Установление связи с базой данных
Для решения главной задачи страницы Second, csp — заполнения таблицы информацией из базы данных — достаточно лишь нескольких строк кода. Следует выполнить запрос Person. W ybor и заполнить строки HTML-таблицы данными, полученными в результате выборки. Задача решается с помощью пары CSP-тегов и соответствующих ссылок.
Технически это потребует редактирования второй строки таблицы в странице Second.csp. В результате имеем:
<CSP: QUERY NAME="pers" CLASSNAM E="Person"
QUERYNAME=”Wybor”>
<CSP:WHILE CONDITION=pers.Next()>
<tr>
<td width=”6%”><a href=Third.csp?Id=#(pers.Get(“ID”))#>
#(pers.Get("ID"))#</a></td>
<td width=”31%”>#( pers.Get ("Name" ))#</td>
<td width=”36%”>#( pers.Get ("Surname" ))#</td>
<td width=”27%”>#(pers.Get("DateOfBirth"))#</td>
</tr>
</CSP:WHILE>
Тег CSP:QUERY после заголовка таблицы обеспечивает выполнение предопределенного запроса Wybor класса Person и сопоставление его результата с объектом pers типа ResultSet. Далее цикл WHILE выводит данные строка за строкой, используя метод Next () объекта ResultSet для проверки условия завершения. Этот метод возвращает значение «пусто», когда все записи результата выборки исчерпаны. До тех пор пока это не так, соответствующие свойства объектов класса Person доступны с помощью метода Get() объекта ResultSet. Способ подстановки значений, полученных из Cache, в HTML-страницы нам уже знаком: #(... )#.
Щелчок по ссылке в столбце ID инициирует запрос к странице Third.csp и одновременно передает ей параметр Id со значением, равным ID интересующего нас физического лица.
Перед страницей Third.csp стоят две задачи:
Для отображения данных достаточно лишь прочитать объект класса Person из базы данных, на который указывает идентификатор (ID), полученный со страницы Second.csp. Для этого используется тег CSP:OBJECT. В результате исходный код страницы приобретает следующий вид (таблица и форма ранее созданы редактором HTML):
< h1> Персональные ванные (#(%request.Get("Id"))#):</hl>
<CSP:OBJECT NAME=pn CLASSNAME=Person
QBJID=#(%request.Get(“Id”)>#>
<form method="POST" name="PersDetail">
<input type="hidden" narne="FId"
value=#(%request.Get (" Id") )#>
<table border="l" width=“69%”>
<tr>
<td width="50%"> Фамилия </td>
<td width="50%”><input type="text" name="FName"
size="20" value="#(pn.Surname)#"></td>
</tr>
<td width="50%"> Имя </td>
<td width=”50%”><input type="text" name="FFirstname"
Size="20" val ue="# (pn. Name>#"></td>
</tr>
<tr>
< td width ="50%”>Дата рождения</ td >
<td width=”50%><input type="text" name=”FDOB”
size="20" value="($ZDate(pn.DateOfBirth))#"></td>
</tr>
<tr>
<td width=”50%”> :</td>
<td width=”50%”><input type="submit"
value “Send” name="Bl"></td>
</tr>
</table>
</form>
<p><a href="Second.csp">Обратно </a></p>
Свойства объекта Person используются как начальные значения полей ввода формы (атрибут value). Функция $ZDate преобразует дату рождения во внешнее представление. Несмотря на то что ID физического лица будет передаваться серверу вместе с другими с этой формы, отображать его на ней ни к чему. Поэтому он помещен в скрытое поле формы (FId).
Следующая задача — сохранение данных в базе — требует программирования метода, вызываемого, как только пользователь нажмет на кнопку Send.
Есть несколько способов решения этой задачи. Как правило, она требует включения дополнительного кода в приложение Cache. Простейшее, хотя и не самое элегантное, решение состоит в использовании скрипта pre-page. Такие скрипты размещаются где-либо в HTML-странице и извлекаются из нее во время компиляции. Страница может содержать не более одного скрипта pre-page, который распознается компилятором следующим образом:
По соглашению, скрипт pre-page размещают как можно ближе к началу страницы, предпочтительно после тега /HEAD. Ниже показан скрипт, расположенный между тегами /HEAD и BODY страницы Second. csp. Эта страница автоматически вызывается по нажатию кнопки Send, так что ей вполне доступны изменения, вносимые в базу данных:
<script language=Cache runat=server>
If %request.Get("FId")="" {
Set pn=##cl ass (Person).%OpenId(%request.Get( "FId"))
Set pn.Name=%request.Get("FName")
Set pn.Surname=%request.Get("FFirstname")
Set pn.DateOfBirth=$ZDateH(%request.Get(“FDOB”))
Set ok=pn.%Save()
If ok {
Do pn.%Close()
} Else {
Set Error="Error during save."
}
}
</script>
В строке заголовка скрипта в качестве языка указан Cache ObjectScript. Код должен выполняться на сервере базы данных (runat=server).
Наконец, придется внести совсем небольшое изменение в исходный текст страницы Third.csp. Оно коснется тега form, открывающего определение формы. Как правило, в параметре action указывается CGI-скрипт, обрабатывающий ввод с формы. В нашем случае он не требуется, поскольку скрипт pre-page страницы Second.csp выполняет всю необходимую обработку. Поэтому в параметре action достаточно указать только CSP-страницу:
<form method="POST" name="PersDetail" action="Second.csp">
Тем самым мы «одним махом» достигаем сразу двух целей: вносим изменения в базу
данных и отображаем обновленные данные в браузере.
4.4. Завершение Web-приложения
Переход по ссылке на главную страницу First.csp завершает наше Web-приложение, закрывая сеанс и освобождая ресурсы для других процессов. Изначальный вариант:
<а href=/default .htm>3aвершение работы</а> <br>
расширим до:
<а href="/default.htm" onClick=
#server(" Set %session.EndSession=l")#>3aвершение работы</ а> <br>
Параметр гиперссылки onClick инициирует обработку строки кода на сервере Cache. Это наглядный пример обработки событий браузера с помощью серверных методов (server side methods) в Cache. Данная команда Set сообщает серверу, что текущий сеанс с пользователем должен быть завершен. Обратите внимание на пробел перед командой Set. Завершение приложения приводит к тому, что Web-сервер переключается на страницу default.htm («Welcome page») из его главного каталога, прекращая взаимодействие с Cache.